package cn.com.stary1993.kite.captcha.config;

import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider;
import cloud.tianai.captcha.resource.impl.provider.URLResourceProvider;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 行为图形验证码配置
 *
 * @author stary1993
 */
@Data
@ConfigurationProperties(prefix = CaptchaProperties.PREFIX + "." + CaptchaProperties.BEHAVIOR)
public class BehaviorImageCaptchaProperties {

	private static Map<String, Long> DEFAULT_EXPIRE_MAP = new HashMap() {
		{
			put("default", 10000L);
			put("WORD_IMAGE_CLICK", 60000L);
		}
	};

	/**
	 * 是否开启
	 */
	private Boolean enabled = true;

	/**
	 * 容错率
	 */
	private Float defaultTolerant = 0.02F;

	/**
	 * 过期key 前缀.
	 */
	private String keyPrefix = "behavior";

	/**
	 * 过期时间.
	 */
	private Map<String, Long> expire = DEFAULT_EXPIRE_MAP;

	/**
	 * 是否清空默认模板
	 */
	private Boolean clearAllTemplates = false;

	/**
	 * 自定义背景图片资源，要求图片像素 590 x 360.
	 */
	private List<Resource> resourceList;

	/**
	 * 自定义模板资源，模板图片格式
	 * <p>
	 * 滑块验证码
	 * <p>
	 * 滑块大小为 110*110 格式为png
	 * <p>
	 * 凹槽大小为 110*110 格式为png
	 * <p>
	 * 模板大小为 110*360 格式为png，该图为固定格式，是一张纯透明图片.
	 * <p>
	 * 旋转验证码
	 * <p>
	 * 滑块大小为 200*200 格式为png
	 * <p>
	 * 凹槽大小为 200*200 格式为png
	 * <p>
	 * 模板大小为 360*360 格式为png，该图为固定格式，是一张纯透明图片.
	 */
	private List<Map<TemplateType, Resource>> templateList;

	/**
	 * 二次验证配置.
	 */
	private SecondaryVerificationProperties secondary = new SecondaryVerificationProperties();

	private CaptchaCacheProperties cache = new CaptchaCacheProperties();

	/**
	 * 资源类型
	 */
	public enum ResourceType {

		CLASSPATH(ClassPathResourceProvider.NAME), URL(URLResourceProvider.NAME);

		public final String name;

		ResourceType(String name) {
			this.name = name;
		}

	}

	/**
	 * 模板模式
	 */
	public enum TemplateModel {

		SLIDER, ROTATE, CONCAT, WORD_IMAGE_CLICK

	}

	/**
	 * 模板类型
	 */
	public enum TemplateType {

		active, fixed, matrix;

	}

	/**
	 * 资源
	 */
	@Data
	@NoArgsConstructor
	public static class Resource {

		/**
		 * 模式
		 */
		private TemplateModel model;

		/**
		 * 资源类型
		 */
		private ResourceType type;

		/**
		 * 图片路径
		 */
		private String path;

	}

	/**
	 * 缓存资源模板配置
	 */
	@Data
	public static class CaptchaCacheProperties {

		/**
		 * 是否开启，默认true
		 */
		private Boolean enabled = true;

		/**
		 * 缓存大小.
		 */
		private Integer cacheSize = 100;

		/**
		 * 缓存拉取失败后等待时间.
		 */
		private Integer waitTime = 500;

		/**
		 * 缓存检查间隔.
		 */
		private Integer period = 100;

	}

	/**
	 * 二次验证配置
	 */
	@Data
	public static class SecondaryVerificationProperties {

		/**
		 * 是否开启
		 */
		private Boolean enabled = false;

		/**
		 * 超时 ms
		 */
		private Long expire = 120000L;

		/**
		 * 缓存key 前缀
		 */
		private String keyPrefix = "secondary";

	}

}
